/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.invoice.model.dao;

import com.invoice.busines.dto.ArticuloDTO;
import com.invoice.busines.dto.ArticulosInventarioDTO;
import com.invoice.busines.dto.ComprobanteDTO;
import com.invoice.busines.dto.ComprobanteDetalleDTO;
import com.invoice.busines.dto.InventarioDTO;
import com.invoice.busines.dto.ArticuloCampoDTO;
import com.invoice.exceptions.InvoiceException;
import com.invoice.enums.Estado;
import com.invoice.model.entities.Articulos;
import com.invoice.model.entities.Articulosinventario;
import com.invoice.model.entities.Comprobante;
import com.invoice.model.entities.Comprobantedetalle;
import com.invoice.model.entities.Inventario;
import com.invoice.model.entities.ArticuloCampo;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;

/**
 *
 * @author laura
 */
public class ArticuloDAOHibernate extends DAOGenerico implements ArticuloDAO{
    ClienteDAOHibernate clienteDAO = new ClienteDAOHibernate();
    VendedorDAOHibernate vendedorDAO = new VendedorDAOHibernate();
    SubcategoriaDAOHibernate subcategoriaDAO = new SubcategoriaDAOHibernate();
    @Override
    public Articulos convertDTOtoPojo(Object object) {
        ArticuloDTO articuloDTO = (ArticuloDTO)object;
        Articulos articulos = new Articulos();
        articulos.setIdArt(articuloDTO.getIdArticulo());
        articulos.setCode(articuloDTO.getCode());
        articulos.setDesArt(articuloDTO.getDescripcion());
        articulos.setStock(articuloDTO.getStock());
        articulos.setMarca(articuloDTO.getMarca());
        articulos.setPcoArt(articuloDTO.getPrecioCompra());
        articulos.setPvpArt(articuloDTO.getPrecioVenta());
        articulos.setEstado(articuloDTO.getEstado());
        articulos.setSubcategoriaUnidad(subcategoriaDAO.convertDTOtoPojo(articuloDTO.getSubcategoriaUnidadDTO()));
        articulos.setSubcategoria(subcategoriaDAO.convertDTOtoPojo(articuloDTO.getSubcategoriaDTO()));
        if(articuloDTO.getArticulosInventario() != null){
            Articulosinventario articulosinventario;
            for (ArticulosInventarioDTO articulosinventarioDTO : articuloDTO.getArticulosInventario()) {
                articulosinventario = new Articulosinventario();
                InventarioDTO inventarioDTO = articulosinventarioDTO.getInventarioDTO();
                Inventario inventario = new Inventario();
                inventario.setFecha(inventarioDTO.getFecha());
                inventario.setIdInventario(inventarioDTO.getIdInventario());
                inventario.setVendedor(vendedorDAO.convertDTOtoPojo(inventarioDTO.getVendedorDTO()));
                inventario.setNomLugar(inventarioDTO.getNomLugar());
                inventario.setNumGuia(inventarioDTO.getNumGuia());
                inventario.setEstado(inventarioDTO.getEstado());
                articulosinventario.setCantidad(articulosinventarioDTO.getCantidad());
                articulosinventario.setIdArticuloInventario(articulosinventarioDTO.getIdArticuloInventario());
                articulosinventario.setInventario(inventario);
                articulos.addArticulosinventario(articulosinventario);
            }
        }
        if(articuloDTO.getComprobanteDetalleDTO() != null){
            Comprobantedetalle comprobanteDetalle;
            for (ComprobanteDetalleDTO comprobanteDetalleDTO : articuloDTO.getComprobanteDetalleDTO()){
                comprobanteDetalle = new Comprobantedetalle();
                Comprobante comprobante = new Comprobante();
                ComprobanteDTO comprobanteDTO = (ComprobanteDTO) comprobanteDetalleDTO.getComprobanteDTO();
                comprobante.setIdComprobante(comprobanteDTO.getIdComprobante());
                comprobante.setNumComp(comprobanteDTO.getNumComp());
                comprobante.setNumGuia(comprobanteDTO.getNumGuia());
                comprobante.setObservac(comprobanteDTO.getObservac());
                comprobante.setFecha(comprobanteDTO.getFecha());
                comprobante.setClientes(clienteDAO.convertDTOtoPojo(comprobanteDTO.getClienteDTO()));
                comprobante.setVendedor(vendedorDAO.convertDTOtoPojo(comprobanteDTO.getVendedorDTO()));
                comprobante.setDescuento(comprobanteDTO.getDescuento());
                comprobante.setTotIva(comprobanteDTO.getTotIva());
                comprobante.setSubTotal(comprobanteDTO.getSubTotal());        
                comprobante.setTotal(comprobanteDTO.getTotal());
                comprobante.setEstado(comprobanteDTO.getEstado());      
                comprobante.setTipoComprobante(comprobanteDTO.getTipoComprobante());
                comprobanteDetalle.setComprobante(comprobante);
                comprobanteDetalle.setCant(comprobanteDetalleDTO.getCant());
                comprobanteDetalle.setIdDetalle(comprobanteDetalleDTO.getNumDet());
                comprobanteDetalle.setPvp(comprobanteDetalleDTO.getPvp());
                articulos.addComprobantedetalle(comprobanteDetalle);
            }
        }
        if(articuloDTO.getArticuloCampoDTOs() != null){
            ArticuloCampo articuloCampo;
            for (ArticuloCampoDTO articuloCampoDTO : articuloDTO.getArticuloCampoDTOs()){
                articuloCampo = new ArticuloCampo();
                articuloCampo.setIdArticuloCampo(articuloCampoDTO.getIdArticuloCampo());
                articuloCampo.setNameLabel(articuloCampoDTO.getNameLabel());
                articuloCampo.setValueLabel(articuloCampoDTO.getValueLabel());
                articulos.addArticuloCampo(articuloCampo);
            }
        }
        return articulos;
    }

    @Override
    public ArticuloDTO convertPojotoDTO(Object object) {
        Articulos articulos = (Articulos)object;
        ArticuloDTO articuloDTO = new ArticuloDTO();
        articuloDTO.setIdArticulo(articulos.getIdArt());
        articuloDTO.setCode(articulos.getCode());
        articuloDTO.setSubcategoriaUnidadDTO(subcategoriaDAO.convertPojotoDTO(articulos.getSubcategoriaUnidad()));
        articuloDTO.setSubcategoriaDTO(subcategoriaDAO.convertPojotoDTO(articulos.getSubcategoria()));
        articuloDTO.setDescripcion(articulos.getDesArt());
        articuloDTO.setMarca(articulos.getMarca());
        articuloDTO.setPrecioVenta(articulos.getPvpArt());
        articuloDTO.setPrecioCompra(articulos.getPcoArt());
        articuloDTO.setStock(articulos.getStock());     
        articuloDTO.setEstado(articulos.getEstado());
        if(articulos.getArticulosinventario() != null){
            ArticulosInventarioDTO articulosInventarioDTO;
            for (Articulosinventario articulosinventario : articulos.getArticulosinventario()) {
                articulosInventarioDTO = new ArticulosInventarioDTO();
                Inventario inventario = (Inventario)articulosinventario.getInventario();
                InventarioDTO inventarioDTO = new InventarioDTO();
                inventarioDTO.setFecha(inventario.getFecha());
                inventarioDTO.setIdInventario(inventario.getIdInventario());
                inventarioDTO.setVendedorDTO(vendedorDAO.convertPojotoDTO(inventario.getVendedor()));
                inventarioDTO.setNomLugar(inventario.getNomLugar());
                inventarioDTO.setNumGuia(inventario.getNumGuia());
                inventarioDTO.setEstado(inventario.getEstado());
                articulosInventarioDTO.setInventarioDTO(inventarioDTO);
                articulosInventarioDTO.setIdArticuloInventario(articulosinventario.getIdArticuloInventario());
                articulosInventarioDTO.setCantidad(articulosinventario.getCantidad());
                articuloDTO.addArticuloInventario(articulosInventarioDTO);
            }
        }
        if(articulos.getComprobantedetalles() != null){
            ComprobanteDetalleDTO comprobanteDetalleDTO;
            for (Comprobantedetalle comprobantedetalle : articulos.getComprobantedetalles()) {
                comprobanteDetalleDTO = new ComprobanteDetalleDTO();
                ComprobanteDTO comprobanteDTO = new ComprobanteDTO();
                Comprobante comprobante = (Comprobante) comprobantedetalle.getComprobante();
                comprobanteDTO.setIdComprobante(comprobante.getIdComprobante());
                comprobanteDTO.setNumComp(comprobante.getNumComp());
                comprobanteDTO.setNumGuia(comprobante.getNumGuia());
                comprobanteDTO.setObservac(comprobante.getObservac());
                comprobanteDTO.setFecha(comprobante.getFecha());
                comprobanteDTO.setClienteDTO(clienteDAO.convertPojotoDTO(comprobante.getClientes()));
                comprobanteDTO.setVendedorDTO(vendedorDAO.convertPojotoDTO(comprobante.getVendedor()));
                comprobanteDTO.setDescuento(comprobante.getDescuento());
                comprobanteDTO.setTotIva(comprobante.getTotIva());
                comprobanteDTO.setSubTotal(comprobante.getSubTotal());        
                comprobanteDTO.setTotal(comprobante.getTotal());
                comprobanteDTO.setEstado(comprobante.getEstado());     
                comprobanteDTO.setTipoComprobante(comprobante.getTipoComprobante());
                comprobanteDetalleDTO.setCant(comprobantedetalle.getCant());
                comprobanteDetalleDTO.setComprobanteDTO(comprobanteDTO);
                comprobanteDetalleDTO.setNumDet(comprobantedetalle.getIdDetalle());
                comprobanteDetalleDTO.setPvp(comprobantedetalle.getPvp());
                articuloDTO.addComprobanteDetalleDTO(comprobanteDetalleDTO);
            }
        }
        ArticuloCampoDTO articuloCampoDTO;
        for (ArticuloCampo articuloCampo : articulos.getArticuloCampos()){
            articuloCampoDTO = new ArticuloCampoDTO();
            articuloCampoDTO.setIdArticuloCampo(articuloCampo.getIdArticuloCampo());
            articuloCampoDTO.setNameLabel(articuloCampo.getNameLabel());
            articuloCampoDTO.setValueLabel(articuloCampo.getValueLabel());
            articuloDTO.addArticuloCampo(articuloCampoDTO);
        }
        return articuloDTO;
    }

    @Override
    public List<ArticuloDTO> findAll() throws InvoiceException {
        List<ArticuloDTO> result = new ArrayList<ArticuloDTO>();
        try {
            startSession();
            Query query=session.createQuery("from Articulos");
            List<Articulos> list = (ArrayList<Articulos>)query.list();
            for (Articulos articulos : list) {
                ArticuloDTO articuloDTO=convertPojotoDTO(articulos);
                result.add(articuloDTO);
            }
            transaction.commit();
            return result;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }
    @Override
    public ArticuloDTO findByIdArticulo(String idArticulo) throws InvoiceException {
        try {
            startSession();
            Query query=session.createQuery("from Articulos where idArt=:idArticulo").setParameter("idArticulo", idArticulo);
            Articulos articulos=(Articulos)query.uniqueResult();
            ArticuloDTO articuloDTO=convertPojotoDTO(articulos);
            transaction.commit();
            return articuloDTO;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }

    @Override
    public List<ArticuloDTO> findByHabilitado() throws InvoiceException {
        List<ArticuloDTO> result = new ArrayList<ArticuloDTO>();
        try {
            startSession();
            Query query=session.createQuery("from Articulos where estado<>:estado").setParameter("estado", Estado.Anulado);
            List<Articulos> list = (ArrayList<Articulos>)query.list();
            for (Articulos articulos : list) {
                ArticuloDTO articuloDTO = convertPojotoDTO(articulos);
                result.add(articuloDTO);
            }
            transaction.commit();
            return result;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }
}